home *** CD-ROM | disk | FTP | other *** search
/ Programming Languages Suite / ProgramD2.iso / Borland / Borland C++ For TASM / HEAP.PAK / MEMTEST.ASM < prev    next >
Assembly Source File  |  1996-02-21  |  10KB  |  501 lines

  1. page 75,132
  2. %title "Object Oriented Memory Management System - TASM 4.0"
  3. %subttl "Testing/Benchmark module"
  4. ; Copyright (c) 1993 By Borland International, Inc.
  5.  
  6. ifndef MDL
  7.     display "Error: This module requires that you provide a memory model"
  8.     display "    definition on the command line. I.E. /dMDL=SMALL."
  9.     display "Also, /m must be given on the command line to enable multiple"
  10.     display "    passes."
  11.  
  12. MDL equ <SMALL>
  13.  
  14. endif
  15.  
  16.  
  17.  
  18. ModuleVersion EQU "0.32"
  19.  
  20. nowarn
  21. jumps
  22. page
  23. locals @@
  24.  
  25. ; Things to check:
  26. ;   Check the effect of /ML  on generated macros for method calls.
  27.  
  28.  
  29. .model small,pascal
  30. .stack 1000h
  31. .code
  32.  
  33. CR  = 0DH
  34. LF  = 0AH
  35.  
  36. ; Int 21 DOS calls
  37. DOSINT             =   21H
  38. DOSRESIZEBLOCK     =   4AH
  39. DOSPRINTSTRING     =   09H
  40. DOSTERMINATE       =   4CH
  41.  
  42. include vmtutil.inc
  43.  
  44. ; Include the display routines
  45.    include display.inc
  46.  
  47. ; Include definitions of the memory system objects
  48.    include mem.inc
  49.  
  50.  
  51. ; Create an advanced decendant of the memory_system !
  52.  
  53. memory_system_advanced STRUC memory_system METHOD \
  54.          init:mptr=memory_system_advanced_init,\
  55.          virtual show:mptr=memory_system_advanced_show
  56.   diskhandle dw ?
  57. memory_system_advanced ends
  58.  
  59. memory_system_advanced_init proc
  60.         ; Must fill in the VMT pointer
  61.          mov  [si.@Mptr_memory_system],offset @TableAddr_memory_system_advanced
  62.          mov  [si.root],0
  63.          mov  [si.last],0
  64.          mov  [si.rover],0
  65.          mov  [si.freespace],0
  66.          mov  [si.usedspace],0
  67.          ret
  68. memory_system_advanced_init endp
  69.  
  70. .data
  71. msas_advanced db "Advanced $"
  72. .code
  73. memory_system_advanced_show proc
  74.          push  ds
  75.          mov   ax,@data
  76.          mov   ds,ax
  77.          mov   dx,offset msas_advanced
  78.          mov   ah,DOSPRINTSTRING
  79.          int   21h
  80.          pop   ds
  81.          call  +@Table_memory_system|show
  82.          ret
  83. memory_system_advanced_show endp
  84.  
  85.  
  86. ; Make the advanced memory system VMT.
  87. MAKE_VMT
  88.  
  89.  
  90. .data
  91.  
  92. ; Declare an instance of the memory system. Note that multiple memory
  93. ; system instances can be declared and if each is initialized with AX
  94. ; other than zero, they each will manage separate heaps.
  95. memory   memory_system {}
  96.  
  97.  
  98. memorya  memory_system_advanced {@Mptr_memory_system = @TableAddr_memory_system_advanced}
  99.  
  100. Psp      dw ?               ; Our PSP
  101. LastSeg  dw seg zzlastseg   ; Segment of the last segment in memory
  102.  
  103. block1   dw ?
  104. block2   dw ?
  105. block3   dw ?
  106. block4   dw ?
  107.          dw 20000 dup (?)
  108.  
  109. .code
  110. start_:
  111.  
  112.      ; Load our data segment
  113.      mov  ax,@data
  114.      mov  ds,ax
  115.  
  116.      ; Store the original PSP in case it is needed.
  117.      mov  [Psp],es
  118.  
  119.      ; Have to give up extra memory that we don't need
  120.      ; so the memory system objects can get blocks of memory.
  121.      mov  bx,[LastSeg]
  122.      mov  ax,es
  123.      sub  bx,ax    ; Size of program as a number of segments is in BX
  124.      mov  ah,DOSRESIZEBLOCK
  125.      int  DOSINT
  126.  
  127.  
  128.      ; Initialize the memory system
  129.      mov  si,offset memory
  130.  
  131.  
  132. comment ~
  133.      ; Only allow memory system to grab 300 paragraphs of memory
  134.      mov  ax,300
  135.  
  136.  
  137.      ; Set ES to point to the virtual tables!
  138.      LoadVMTSeg  ES
  139.      call [si] method memory_system:init
  140.      call [si] method memory_system:show
  141.  
  142.      mov  cx,100
  143.      mov  di,offset block1
  144. t1:
  145.      mov  ax,2
  146.      call [si] method memory_system:alloc
  147.      mov  [di],ax
  148.      add  di,2
  149.      loop t1
  150.  
  151.      call [si] method memory_system:show
  152.      call CRLF
  153.      call CRLF
  154.  
  155.      mov  cx,100
  156.      mov  di,offset block1
  157. t2:
  158.      mov  ax,[di]
  159.      call [si] method memory_system:free
  160.      mov  word ptr [di],0
  161.      add  di,2
  162.      loop t2
  163.  
  164.      call [si] method memory_system:show
  165.      call CRLF
  166.      call CRLF
  167.  
  168.  
  169.  
  170.      mov  ax,90
  171.      call [si] method memory_system:alloc
  172.      mov  [block1],ax
  173.      call [si] method memory_system:show
  174.  
  175.      mov  ax,90
  176.      call [si] method memory_system:alloc
  177.      mov  [block2],ax
  178.      call [si] method memory_system:show
  179.  
  180.      mov  ax,90
  181.      call [si] method memory_system:alloc
  182.      mov  [block3],ax
  183.      call [si] method memory_system:show
  184.  
  185.  
  186.      mov  ax,[block2]
  187.      call [si] method memory_system:free
  188.      call [si] method memory_system:show
  189.  
  190.      mov  ax,[block1]
  191.      call [si] method memory_system:free
  192.      call [si] method memory_system:show
  193.  
  194.      mov  ax,[block3]
  195.      call [si] method memory_system:free
  196.      call [si] method memory_system:show
  197.      call CRLF
  198.      call CRLF
  199.  
  200. ~
  201.      ; Allow memory system to grab all the memory it can
  202.      mov  ax,0
  203.  
  204.  
  205.      ; Set ES to point to the virtual tables!
  206.      LoadVMTSeg  ES
  207.      call [si] method memory_system:init
  208.      call [si] method memory_system:show
  209.  
  210.  
  211. ; Test using memory_system:alloc and memory_block:markfree
  212. blockcount=20
  213.  
  214.      ; Get 20 blocks of various sizes
  215.      mov  cx,blockcount
  216.      mov  di,offset block1
  217. again:
  218.      mov  ax,cx
  219.      and  ax,0fh
  220.      cmp  al,0
  221.      jne  again_2
  222. ;     call [si] method memory_system:show
  223. again_2:
  224.      inc  ax
  225.      inc  ax
  226.      call [si] method memory_system:alloc
  227.      mov  [di],ax
  228.      inc  di
  229.      inc  di
  230.      loop again
  231.  
  232. ;     call [si] method memory_system:show
  233. ;     call CRLF
  234. ;     call CRLF
  235.  
  236.      xor  si,si
  237.      ; Now free up half of them
  238.      mov  cx,blockcount/2
  239.      mov  di,offset block1
  240. again_3:
  241.      mov  ax,cx
  242.      and  ax,0fh
  243.      cmp  al,0
  244.      jne  again_4
  245. ;     call [si] method memory_system:show
  246. again_4:
  247.      mov  ax,[di]
  248.      mov  word ptr [di],0
  249.      cmp  ax,0
  250.      je   again_5
  251.      push ds
  252.      mov  ds,ax
  253.      call [si] method memory_block:MarkFree
  254.      pop  ds
  255. again_5:
  256.      add  di,4
  257.      loop again_3
  258.  
  259. ;     call [si] method memory_system:show
  260. ;     call CRLF
  261. ;     call CRLF
  262.  
  263.      ; Now free up all the rest
  264.      mov  cx,blockcount
  265.      mov  di,offset block1
  266. again_6:
  267.      mov  ax,cx
  268.      and  ax,0fh
  269.      cmp  al,0
  270.      jne  again_7
  271. ;     call [si] method memory_system:show
  272. again_7:
  273.      mov  ax,[di]
  274.      mov  word ptr [di],0
  275.      cmp  ax,0
  276.      je   again_8
  277.      push ds
  278.      mov  ds,ax
  279.      call [si] method memory_block:MarkFree
  280.      pop  ds
  281.  
  282. again_8:
  283.      add  di,2
  284.      loop again_6
  285.  
  286. ;     call [si] method memory_system:show
  287. ;     call CRLF
  288. ;     call CRLF
  289.  
  290.      mov  si,offset memory
  291.      ; Now allocate 13 large blocks
  292.      mov  cx,13
  293.      mov  di,offset block1
  294. final:
  295.      mov  ax,200
  296.      call [si] method memory_system:alloc
  297.      mov  [di],ax
  298.      add  di,2
  299.      loop final
  300.  
  301.  
  302. ;     call [si] method memory_system:show
  303. ;     call CRLF
  304. ;     call CRLF
  305.  
  306.      xor  si,si
  307.      mov  cx,13
  308.      mov  di,offset block1
  309. final2:
  310.      mov  ax,[di]
  311.      push ds
  312.      mov  ds,ax
  313.      call [si] method memory_block:MarkFree
  314.      pop  ds
  315.      add  di,2
  316.      loop final2
  317.  
  318.  
  319.      mov  si,offset memory
  320.       ; Now allocate 15 larger blocks
  321.      mov  cx,15
  322.      mov  di,offset block1
  323. final3:
  324.      mov  ax,250
  325.      call [si] method memory_system:alloc
  326.      mov  [di],ax
  327.      add  di,2
  328.      loop final3
  329.  
  330.  
  331. ;     call [si] method memory_system:show
  332. ;     call CRLF
  333. ;     call CRLF
  334.  
  335.      xor  si,si
  336.      mov  cx,15
  337.      mov  di,offset block1
  338. final4:
  339.      mov  ax,[di]
  340.      cmp  ax,0
  341.      jz   final4b
  342.      push ds
  343.      mov  ds,ax
  344.      call [si] method memory_block:MarkFree
  345.      pop  ds
  346. final4b:
  347.      add  di,2
  348.      loop final4
  349.  
  350.      mov  si,offset memory
  351.  
  352. comment ~
  353. ; Test using memory_system:alloc and memory_system:free
  354. blockcount=20
  355.  
  356.      ; Get 20 blocks of various sizes
  357.      mov  cx,blockcount
  358.      mov  di,offset block1
  359. again:
  360.      mov  ax,cx
  361.      and  ax,0fh
  362.      cmp  al,0
  363.      jne  again_2
  364. ;     call [si] method memory_system:show
  365. again_2:
  366.      inc  ax
  367.      inc  ax
  368.      call [si] method memory_system:alloc
  369.      mov  [di],ax
  370.      inc  di
  371.      inc  di
  372.      loop again
  373.  
  374. ;     call [si] method memory_system:show
  375. ;     call CRLF
  376. ;     call CRLF
  377.  
  378.      ; Now free up half of them
  379.      mov  cx,blockcount/2
  380.      mov  di,offset block1
  381. again_3:
  382.      mov  ax,cx
  383.      and  ax,0fh
  384.      cmp  al,0
  385.      jne  again_4
  386. ;     call [si] method memory_system:show
  387. again_4:
  388.      mov  ax,[di]
  389.      mov  word ptr [di],0
  390.      cmp  ax,0
  391.      je   again_5
  392.      call [si] method memory_system:free
  393. again_5:
  394.      add  di,4
  395.      loop again_3
  396.  
  397. ;     call [si] method memory_system:show
  398. ;     call CRLF
  399. ;     call CRLF
  400.  
  401.      ; Now free up all the rest
  402.      mov  cx,blockcount
  403.      mov  di,offset block1
  404. again_6:
  405.      mov  ax,cx
  406.      and  ax,0fh
  407.      cmp  al,0
  408.      jne  again_7
  409. ;     call [si] method memory_system:show
  410. again_7:
  411.      mov  ax,[di]
  412.      mov  word ptr [di],0
  413.      cmp  ax,0
  414.      je   again_8
  415.      call [si] method memory_system:free
  416. again_8:
  417.      add  di,2
  418.      loop again_6
  419.  
  420. ;     call [si] method memory_system:show
  421. ;     call CRLF
  422. ;     call CRLF
  423.  
  424.      ; Now allocate 13 large blocks
  425.      mov  cx,13
  426.      mov  di,offset block1
  427. final:
  428.      mov  ax,200
  429.      call [si] method memory_system:alloc
  430.      mov  [di],ax
  431.      add  di,2
  432.      loop final
  433.  
  434.  
  435. ;     call [si] method memory_system:show
  436. ;     call CRLF
  437. ;     call CRLF
  438.  
  439.      mov  cx,13
  440.      mov  di,offset block1
  441. final2:
  442.      mov  ax,[di]
  443.      call [si] method memory_system:free
  444.      add  di,2
  445.      loop final2
  446.  
  447.  
  448.      ; Now allocate 15 larger blocks
  449.      mov  cx,15
  450.      mov  di,offset block1
  451. final3:
  452.      mov  ax,250
  453.      call [si] method memory_system:alloc
  454.      mov  [di],ax
  455.      add  di,2
  456.      loop final3
  457.  
  458.  
  459. ;     call [si] method memory_system:show
  460. ;     call CRLF
  461. ;     call CRLF
  462.  
  463.      mov  cx,15
  464.      mov  di,offset block1
  465. final4:
  466.      mov  ax,[di]
  467.      call [si] method memory_system:free
  468.      add  di,2
  469.      loop final4
  470.  
  471. ~
  472.      call [si] method memory_system:show
  473.      call CRLF
  474.      call CRLF
  475.      call [si] method memory_system:freeall
  476.      call [si] method memory_system:show
  477.      call CRLF
  478.      call CRLF
  479.  
  480.      ; Try the same calls with the advanced memory system object
  481.      mov  si,seg memorya
  482.      mov  ds,si
  483.      mov  si,offset memorya
  484.  
  485.      ; Set ES to point to the virtual tables!
  486.      LoadVMTSeg  ES,BX
  487.      call [si] method memory_system_advanced:init
  488.      call [si] method memory_system_advanced:show
  489.      call [si] method memory_system_advanced:freeall
  490.      mov  ah,DOSTERMINATE
  491.      int  DOSINT
  492.  
  493. @curseg ends
  494.  
  495. zzlastseg segment
  496.  
  497. zzlastseg ends
  498.  
  499. end start_
  500.  
  501.